从总线上LS操作数

asm volatile("vsetvli %0, %1, e32, m1, ta, ma" : "=r"(vl) : "r"(avl));
asm volatile("vle32.v v1,  (%0)" ::"r"((CHDATA->i_prompt)));
asm volatile("vle32.v v2,  (%0)" ::"r"((CHDATA->q_prompt)));
asm volatile("vse32.v v1,  (%0)" ::"r"(i_sum));
asm volatile("vse32.v v2,  (%0)" ::"r"(q_sum));
9301 cyc vs. 10000 cyc

优化移位

CHDATA->ms_sign[ch] = CHDATA->ms_sign[ch] << 1;
9184 cyc vs. 10000 cyc

带条件或

if (q_sum[ch] < 0)
CHDATA->ms_sign[ch] = CHDATA->ms_sign[ch] | 0x1;

9109 cyc vs. 10000 cyc
实际上Spatz并不支持真正的掩码操作

数学计算

dcarr[ch] = (i_sum[ch] * -1024) * sign(q_sum[ch]) / rss_temp1[ch];
向量化vss
9053 cyc vs. 10000 cyc or10494(带abs)

实验结果

IPU = 4 同时8个环路滤波

1627 cyc VS. 10052 cyc
3260 cys VS. 14657 cyc

2,016 cys VS. 10052 cyc
3,625 cys VS. 20,053 cyc
6,911 cys VS. 39934 cyc

1392 + 144*3 bytes VS. + 3172 + 172 *3bytes
vrf相当于一个数据暂存区,从而不用频繁的发送寄存器与内存之间的数据交换,节省了运算的时钟周期
if ls消耗时钟周期数

1340 总线read
639 总线write
99 总线read
201 总线write

1238 总线read
608 总线write
102 总线read
210 总线write

Vivado综合@2022.2

VREGS = 32 * 256bits

cv32e40p

Pasted image 20250423154756.png

4ipu 0fpu

0.063
Pasted image 20250429103236.png
Pasted image 20250429103435.png

no spatz

0.031W
Pasted image 20250423150917.png
Pasted image 20250414193730.png

4IPU 4FPU

0.173
0.169
Pasted image 20250429110823.png
Pasted image 20250429110257.png